package edu.ccut.saturn.component.impl;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import edu.ccut.saturn.component.IBundleValidateInfo;
import edu.ccut.saturn.component.ILogger;
import edu.ccut.saturn.component.IValidateInfo;
import edu.ccut.saturn.component.SaturnComponentException;
import edu.ccut.saturn.component.SaturnLoggerManager;

public class SaturnBundleValidateInfo implements IBundleValidateInfo {

	private static final String LOGGER_KEY_LOAD_BUNDLE = SaturnLoggerManager.LOGGER_KEY_LOAD_BUNDLE;

	protected static ILogger logger = SaturnLoggerManager.getInstance()
			.getSaturnLogger(LOGGER_KEY_LOAD_BUNDLE);

	private String bundlesSymbolicName;

	private Map<String, IValidateInfo> validateInfoMap;

	public SaturnBundleValidateInfo(String bundlesSymbolicName) {
		this.bundlesSymbolicName = bundlesSymbolicName;
		this.validateInfoMap = new HashMap<String, IValidateInfo>();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#addValidateInfo(edu.ccut.saturn.component.IValidateInfo)
	 */
	public void addValidateInfo(IValidateInfo validateInfo)
			throws SaturnComponentException {

		if (validateInfo != null) {
			validateValidateInfoKey(validateInfo);
			this.validateInfoMap.put(validateInfo.getKey(), validateInfo);
			logger.debug("add validate information \"" + validateInfo.getKey()
					+ "\" from " + this.bundlesSymbolicName + " bundle");
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#addValidateInfos(java.util.Collection)
	 */
	public void addValidateInfos(Collection<IValidateInfo> validateInfos)
			throws SaturnComponentException {

		if (validateInfos != null) {

			for (IValidateInfo validateInfo : validateInfos) {
				validateValidateInfoKey(validateInfo);
			}

			for (IValidateInfo validateInfo : validateInfos) {
				this.addValidateInfo(validateInfo);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#getBundleSymbolicName()
	 */
	public String getBundleSymbolicName() {
		return this.bundlesSymbolicName;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#getValidateInfos()
	 */
	public Collection<IValidateInfo> getValidateInfos() {
		return this.validateInfoMap.values();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#getValidateInfoKeys()
	 */
	public Set<String> getValidateInfoKeys() {
		return this.validateInfoMap.keySet();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see edu.ccut.saturn.component.impl.IBundleValidateInfo#getValidateInfo(java.lang.String)
	 */
	public IValidateInfo getValidateInfo(String componentKey) {
		return this.validateInfoMap.get(componentKey);
	}

	private void validateValidateInfoKey(IValidateInfo validateInfo)
			throws SaturnComponentException {

		if (validateInfo.getKey() == null) {
			logger
					.error("add validateInfo failed, because the validateInfo key is null");

			throw new SaturnComponentException(
					"add validateInfo failed, because the validateInfo key is null");
		}

		if (this.validateInfoMap.containsKey(validateInfo.getKey())) {
			logger
					.debug("add validateInfo failed, because the validateInfo key ["
							+ validateInfo.getKey() + "] is already existed");

			throw new SaturnComponentException(
					"add validateInfo failed, because the validateInfo key ["
							+ validateInfo.getKey() + "] is already existed");
		}
	}
}
